#include "TextureManager.h"
#include "GLTexture.h"

using std::map;
using std::string;

bool TextureManager::m_instanceFlag = false;
TextureManager* TextureManager::m_manager = NULL;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

TextureManager::~TextureManager(void)
{
    m_instanceFlag = false;
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

TextureManager* TextureManager::getInstance(void)
{
    if(!m_instanceFlag)
    {
        m_manager = new TextureManager();
        m_instanceFlag = true;
        return m_manager;
    }
    else
    {
        return m_manager;
    }
}

bool TextureManager::addTexture(boost::shared_ptr<GLTexture> texture) 
{
    bool ok = true;
    map<string, boost::shared_ptr<GLTexture>>::iterator it = m_textures.find(texture->filename());
    if (it == m_textures.end())
    {
        if (!texture->initialize())
        {
            ok = false;
        }
        else
        {
            m_textures[texture->filename()] = texture;
        }
    }

    return ok;
}

bool TextureManager::hasTexture(const string &filename)
{
    bool found = true;
    map<string, boost::shared_ptr<GLTexture>>::iterator it = m_textures.find(filename);
    if (it == m_textures.end())
    {
        found = false;
    }
    return found;
}

void TextureManager::purgeTextures(void)
{
    m_textures.clear();
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

boost::shared_ptr<GLTexture> TextureManager::getTexture(const string &name) const
{
    return m_textures.find(name)->second;
}

///////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////

TextureManager::TextureManager(void)
{
    m_textures.clear();
}

